package logica;
import java.util.Stack;
import java.util.Vector;
import java.lang.StringBuffer;

public class AnalizadorSintactico  {
	
	private String texto;
	private Vector <String> tagsApertura;
	private Vector <String> tagsCierre;	
	public boolean correcto;
	
	
	public AnalizadorSintactico(String aTexto)
	{
		this.texto = aTexto;
		this.tagsApertura = new Vector<String>();
		this.tagsCierre = new Vector<String>();

		//Tags de Apertura
		this.tagsApertura.add("<sec>");
		this.tagsApertura.add("<tit>");
		this.tagsApertura.add("<con>");

		//Tags de Cierre
		this.tagsCierre.add("</sec>");
		this.tagsCierre.add("</tit>");
		this.tagsCierre.add("</con>");

	}
	
	public boolean esTagApertura(String aTag)
	{
		return this.tagsApertura.contains(aTag);
	}

	public boolean esTagCierre(String aTag)
	{
		return this.tagsCierre.contains(aTag);
	}
	
	public boolean validar() throws Exception
	{
		//this.texto = this.texto.replace("\n", "");		
		//this.texto = this.texto.replace("\t", "");
		this.texto = texto.trim();
		StringBuffer documento = new StringBuffer(this.texto);		
		
		Stack<String> tags = new Stack<String>();
		String tag="";
		if (documento.length()==0)
		{
			throw new Exception("Error: Sintaxis con errores en el texto");
		}
		
		while (documento.length()>0)
		{
			int aperturaTag = documento.indexOf("<");
			int cierreTag = documento.indexOf(">")+1;
			if (aperturaTag != -1 && cierreTag != -1)
			{
				tag = documento.substring(aperturaTag, cierreTag);
				documento = (new StringBuffer(documento.substring(cierreTag).trim()));
				if (esTagApertura(tag))
				{
					if (tag.equals(tagsApertura.elementAt(0))) // <sec>
					{	// tag vacio || el elemento anterior = </sec> o el elemento anterior es <con>
						if (tags.empty() || (tags.lastElement().equals(tagsCierre.elementAt(0))) || (tags.lastElement().equals(tagsApertura.elementAt(2))))
						{
							tags.push(tag);							
						}
						else
						{
							throw new Exception("Error: Sintaxis con errores en el texto");
						}
					}
					else if (tag.equals(tagsApertura.elementAt(1))) // <tit>
					{   //El tag anterior a <tit> debe ser siempre un <sec>
						if (!tags.empty() || (tags.lastElement().equals(tagsApertura.elementAt(0))))
						{
							tags.push(tag);							
						}
						else
						{
							throw new Exception("Error: Sintaxis con errores en el texto");
						}
					}
					else if (tag.equals(tagsApertura.elementAt(2))) // <con>
					{
						if (!tags.empty() || (tags.lastElement().equals(tagsCierre.elementAt(1)))) //</tit>
						{
							tags.push(tag);							
						}
						else
						{
							throw new Exception("Error: Sintaxis con errores en el texto");
						}
					}
				}
				else 
				{
					boolean esTagApertura= esTagApertura(tags.lastElement());
					String pop = tags.lastElement();
					String elementoSinSlash = tag.replace("/", "");
					
					if (tags.empty())
					{
						throw new Exception("Error: Pila Vacia");
					}
					else if (!esTagApertura || !(pop.equals(elementoSinSlash)))
					{
						throw new Exception("Error: Sintaxis con errores en el texto");
					}
					else
					{
						tags.pop();
					}
				}				
			}
			else
			{ //Aca o hay un error de sintaxis o hay espacios despues del ultimo tag.
				throw new Exception("Error: Sintaxis con errores en el texto");
			}
		}	
		return true;
	}
	
}


